#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define MAX_LIST_SIZE 1000

#define SYS_ERROR(msg,n) do {perror(msg);exit(n);} while(0)
#define PJD_ERROR(msg,n) do {fprintf(stderr,"%s\n",msg);exit(n);} while(0)

#include "pjd.h"

int
main(int argc, char* argv[])
{
    char* arquivo;
    char* destino;
    unsigned short porto;
    int   pjdd, fd;          /* descritores do protocolo e do arquivo */
    int   buflen;            /* maior mensagem sobre PJD */
    int   nread;             /* no. de bytes lidos do arquivo */
    char  msg[MAX_PJD_MSG];  /* buffer para dados lidos e enviados */
/*
    list lista(5);
    char bla[512];
    bla[0]='a';
    bla[1]='\0';
    bla[2]='a';
    bla[3]='\0';
    bla[4]='a';

    char bleb[512];
        bleb[0]='a';
        bleb[1]='3';
        bleb[2]='a';
        bleb[3]='4';
        bleb[4]='a';
        bleb[5]='1';

    windowPackage teste(12,12,5,bla);
    windowPackage teste2(12,12,6,bleb);
    lista.insertNode(&teste);
    bla[1]='2';
    windowPackage teste3(12,12,5,bla);
    lista.insertNode(&teste);
    lista.insertNode(&teste2);
    lista.insertNode(&teste3);
    lista.printList();



    list newList;
    pjdConnection tst(1, 1, 123);
    pjdConnection tst2(2, 2, 123);
    pjdConnection tst3(3, 3, 123);
    pjdConnection tst4(4, 4, 123);
    newList.insertNode(&tst);
    newList.insertNode(&tst2);
    newList.insertNode(&tst3);
    newList.insertNode(&tst4);

    pjdConnection* a = (pjdConnection*) newList.searchNode(4);
    a->printNode(1);
    //a->
*/
    /*for(int i =0; i< 5; i++){

    	teste.info=i;
    	lista.insertNode(teste);

    }
    teste.info=1234;
    lista.insertNode(teste);
    for(int i =0; i< 5; i++){

    	teste.info=i;
    	lista.insertNode(teste);

    }
    lista.printList();
    lista.removeFirstNode();
    lista.printList();
    lista.removeFirstNode();
    lista.printList();
*/


    if (argc!=4) {
        fprintf(stderr,"Uso correto: %s arq. end_dest. porto\n", argv[0]);
        exit(1);
    }

    arquivo = argv[1];
    destino = argv[2];
    porto   = atoi(argv[3]);

    printf("Enviando arquivo %s para o porto %d da m�quina %s\n",
            arquivo, porto, destino);

    if ((fd=open(arquivo,O_RDONLY))<0)
        SYS_ERROR("open",2);
    if (pjd_init(0)<0)
        PJD_ERROR("pjd_init",3);
    if ((buflen=MAX_PJD_MSG)<0)
        PJD_ERROR("pjd_mtu",4);
    if ((pjdd=pjd_ativo(destino,porto))<0)
        PJD_ERROR("pjd_ativo",5);

//    char teste[3] = {'a','b','c'};
//    int sent = pjd_send(pjdd, teste, 3);
//    if(sent < 0)
//    	PJD_ERROR("pjd_send",6);
//
//    char teste2[3] = {'d','e','f'};
//	sent = pjd_send(pjdd, teste2, 3);
//	if(sent < 0)
//		PJD_ERROR("pjd_send",6);

    while ( (nread=read(fd,msg,buflen))>0 ) {
        if (pjd_send(pjdd,msg,nread)<0)
                PJD_ERROR("pjd_send",6);
        printf("Dentro do while \n");
    }
    printf("Sai do while \n");

    pjd_close(pjdd);
    printf("Sai do close \n");
    if (nread<0)
        SYS_ERROR("read",7);
    close(fd);
    printf("Sai de tudo \n");
}

